// @description: dashboard归类涉及所有面板数据相关的业务逻辑
//               其中，本文件涉及task任务类相关的
package ctrdashboard

import (
    "time"
    "fmt"
    "cloud_worm/util/umodels/mysqldb/dbtask"
    "cloud_worm/wormweb/controllers/ctrconfig"
    "cloud_worm/util/uhttp"
    "github.com/astaxie/beego/logs"
)

// @Description：dashboard task 信息获取的Controller
type DbdTaskCntController struct {
    ctrconfig.LoginCtr
}

/**
 @Description：dashboard task 获取的信息
 @Param:
 @Return：
 */
func (d *DbdTaskCntController) Get() {
    if d.Guest() == false {
        return
    }

    taskCnt := &TaskInfoCount{}

    // 参数解析
    inputType, err := d.GetInt("type", CountTypeWeek)
    if err != nil {
        logMsg := fmt.Sprintf("parse `type` error: %s", err.Error())
        logs.Error(logMsg)
        d.Data["json"] = uhttp.CreateErrResponse(uhttp.RespCodeParamErr, logMsg, taskCnt)
        d.ServeJSON()
        return
    }
    if inputType != CountTypeWeek && inputType != CountTypeMonth {
        logMsg := fmt.Sprintf("input `type` not '%d(week)' and '%d(month)', is '%d'", CountTypeWeek, CountTypeMonth, inputType)
        logs.Error(logMsg)
        d.Data["json"] = uhttp.CreateErrResponse(uhttp.RespCodeParamErr, logMsg, taskCnt)
        d.ServeJSON()
        return
    }

    // 设置time
    err = taskCnt.SetTime()
    if err != nil {
        logMsg := fmt.Sprintf("task cnt settime error: %s", err.Error())
        logs.Error(logMsg)
        d.Data["json"] = uhttp.CreateErrResponse(uhttp.RespCodeSystemErr, logMsg, taskCnt)
        d.ServeJSON()
        return
    }

    err = taskCnt.GetTaskCnt()
    if err != nil {
        logs.Error(err.Error())
        d.Data["json"] = uhttp.CreateErrResponse(uhttp.RespCodeSystemErr, err.Error(), taskCnt)
        d.ServeJSON()
        return
    }
    err = taskCnt.GetCheckCnt()
    if err != nil {
        logs.Error(err.Error())
        d.Data["json"] = uhttp.CreateErrResponse(uhttp.RespCodeSystemErr, err.Error(), taskCnt)
        d.ServeJSON()
        return
    }

    d.Data["json"] = uhttp.CreateOkResponse(taskCnt)
    d.ServeJSON()
    return
}

// @Description：报告模式
const (
    CountTypeWeek = 1               // 周的模式
    CountTypeMonth = 2              // 月的模式
)

// @Description: 任务相关的统计数据
type TaskInfoCount struct {
    Type            int             // 月
    StartTime       int64           // 时间段开始点
    EndTime         int64           // 时间段截止点

    TaskCnt         int             // 任务数
    CheckCnt        int             // 执行的检查数
}

/**
 @Description：设置时间段
 @Param:
 @Return：
 */
func (t *TaskInfoCount) SetTime() error {
    t.EndTime = time.Now().Unix()
    dayDura, _ := time.ParseDuration("-24h")            // 提前一天的day duration

    if t.Type == CountTypeWeek {
        t.StartTime = time.Now().Add(7 * dayDura).Unix()          // 周报7天之前
    } else if t.Type == CountTypeMonth {
        t.StartTime = time.Now().Add(30 * dayDura).Unix()
    } else {
        return fmt.Errorf("count type error: %d", t.Type)
    }

    return nil
}

/**
 @Description：获取任务数(task count)
 @Param:
 @Return：
 */
func (t *TaskInfoCount) GetTaskCnt() (error) {
    w := dbtask.WeaponTask{}
    tmpCnt, err := w.CountByTimeDuration(t.StartTime, t.EndTime)
    if err != nil {
        return fmt.Errorf("get task cnt error: %s", err.Error())
    }

    t.TaskCnt = int(tmpCnt)
    return nil
}

/**
 @Description：检查的次数
 @Param:
 @Return：
 */
func (t *TaskInfoCount) GetCheckCnt() error {
    w := dbtask.WeaponTask{}
    tmpCnt, err := w.CheckCountByTimeDuration(t.StartTime, t.EndTime)
    if err != nil {
        return fmt.Errorf("get check cnt error: %s",  err.Error())
    }

    t.CheckCnt = int(tmpCnt)
    return nil
}